package q94_inorderTraversal;

import CommonClass.Common.TreeNode;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

public class Solution_2 {
    public List<Integer> inorderTraversal(TreeNode root){
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }

        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        while (!stack.isEmpty() || node != null){
            // 不停的将左子节点加入栈中
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            // 开始弹出节点
            // 此时弹出的节点也就是最左的节点了
            // 假设这个节点没有子节点 在这个节点后就会弹出根节点
            // 在这之后就会加入根节点
            node = stack.pop();
            res.add(node.val);
            // 而假设根节点有右节点 就会加入右节点
            // 也就满足了左 根 右的顺序
            node = node.right;
        }

        return res;
    }
}
